#include <stdio.h>
#include <stdlib.h> //exit 函数头文件
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

// int main()
// {
//   //execle 函数
//   pid_t id = fork();
//   if(id == 0)
//   {
//     printf("you can see me\n");

//     char* const myenv[] = {"myval=100", NULL};  //自定义环境变量表

//     extern char** environ;

//     execle("./other/CPP", NULL, environ); //继承环境变量表

//     printf("you can see me again?");
//     exit(-1);
//   }

//   int status = 0;
//   waitpid(id, &status, 0);  //等待阻塞
//   if(WEXITSTATUS(status) != 255)
//     printf("子进程替换成功 exit_code:%d\n", WEXITSTATUS(status));
//   else
//     printf("子进程替换失败 exit_code:%d\n", WEXITSTATUS(status));

//   return 0;
// }

int main()
{
  //execvp 函数
  pid_t id = fork();
  if(id == 0)
  {
    printf("子进程创建成功 PID:%d   PPID:%d\n", getpid(), getppid());
    char* const argv[] = 
    {
      "ls",
      // "-a",
      // "-l",
      NULL
    };

    //execvp("a.out", argv);
    extern char** environ;

    //execvpe("ls", argv, environ);

    execve("./other/CPP", argv, environ);

    printf("程序替换失败\n");
    exit(-1); //如果子进程有此退出码，说明替换失败
  }

  int status = 0;
  waitpid(id, &status, 0); //父进程阻塞等待
  if(WEXITSTATUS(status) != 255)
  {
    printf("子进程替换成功，程序正常运行 exit_code:%d\n", WEXITSTATUS(status));
  }
  else
  {
    printf("子进程替换失败，异常终止 exit_code:%d\n", WEXITSTATUS(status));
  }

  return 0;
}

// int main()
// {
//   //execlp 函数
//   pid_t id = fork();
//   if(id == 0)
//   {
//     printf("you can see me\n");

//     execlp("ls", "ls", "-a", "-l", NULL); //程序替换

//     printf("you can see me again?");
//     exit(-1);
//   }

//   int status = 0;
//   waitpid(id, &status, 0);  //等待阻塞
//   if(WEXITSTATUS(status) != 255)
//     printf("子进程替换成功 exit_code:%d\n", WEXITSTATUS(status));
//   else
//     printf("子进程替换失败 exit_code:%d\n", WEXITSTATUS(status));

//   return 0;
// }

// int main()
// {
//   //execv 函数
//   pid_t id = fork();
//   if(id == 0)
//   {
//     printf("子进程创建成功 PID:%d   PPID:%d\n", getpid(), getppid());
//     char* const argv[] = 
//     {
//       "ls",
//       "-a",
//       "-l",
//       NULL
//     };

//     execv("/usr/bin", argv); //故意提供错误路径

//     printf("程序替换失败\n");
//     exit(-1); //如果子进程有此退出码，说明替换失败
//   }

//   int status = 0;
//   waitpid(id, &status, 0); //父进程阻塞等待
//   if(WEXITSTATUS(status) != 255)
//   {
//     printf("子进程替换成功，程序正常运行 exit_code:%d\n", WEXITSTATUS(status));
//   }
//   else
//   {
//     printf("子进程替换失败，异常终止 exit_code:%d\n", WEXITSTATUS(status));
//   }

//   return 0;
// }

/*int main()
{
  //execl 函数
  printf("程序替换前，you can see me\n");
  int ret = execl("/usr/bin/ls", "ls", "-a", "-l", NULL);

  if(ret == -1)
    printf("程序替换失败！\n");

  printf("程序替换后，you can see me again?\n");
  return 0;
}*/
